package com.scheduletask.task;

import ch.qos.logback.core.util.TimeUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author rise
 * @date 2024年10月31日 14:14
 */
@Slf4j
@Component
public class SpringTask {

    /**
     * cron 表达式 每秒执行一次任务
     */
//    @Scheduled(cron = "0/1 * * * * *")
    public void test(){
        log.info("test");
    }

    /**
     * fixedRate 每间隔两秒执行一次任务
     * 注意默情况下定时任务是在同一线程同步执行的，如果任务的执行时间（如大于5秒）大于间隔时间，则会等待任务执行结束后直接开始下次任务
     */
//    @Scheduled(fixedRate = 2000)
    public void test0(){
        log.info("test0-start");
        sleep(5);
        log.info("test0-end");
    }

    /**
     * fixedDelay: 每次延时两秒执行一次任务
     * 注意，这里等待上次任务执行结束后，在演示固定时间后开始下次任务
     */
//    @Scheduled(fixedDelay = 2000)
    public void test1(){
        log.info("test1-start");
        sleep(5);
        log.info("test1-end");
    }

    /**
     * initialDelay : 首次任务启动的延时时间
     */
    @Scheduled(initialDelay = 2000, fixedRate = 3000)
    public void test2(){
        log.info("test2-start");
        sleep(5);
        log.info("test2-end");
    }


    /**
     * 延时函数
     * @param seconds 时间（单位秒）
     */
    @SneakyThrows
    public void sleep(Integer seconds){
        TimeUnit.SECONDS.sleep(seconds);
    }
}
